Git 分支管理

确认当前所在分支

进行分支操作前,请先确认当前工作分支,避免出现误操作。

  • 使用 git branch 命令,见下文
  • souretree 左侧边栏 BRANCHES 下,加粗的是当前分支

rebase 与 merge

  • merge 是直接将两个分支汇合。
  • rebase 是将当前分支在要合并的分支上重新演化。工作流程如下:
    1. 先找到当前分支与要合并分支的分叉点
    2. 对分叉点后的每个提交,计算它与前一点的差异代码, 在要合并分支上应用并提交(这一步有可能产生冲突)
    3. 删除当前分支的到分叉点的所有记录
    4. 将当前分支指针指向第2步得到的演化结果

before-pull
合并前的状态

git-pull
git merge origin/master

git-pull-rebase
git rebase origin/master。算出 b1 到 a1的 差异代码,应用到 a2 上,master 指针指向新的 b1,删除旧的 b1。

远程分支

$ git pull

如果设置了某个分支用于跟踪某个远程仓库的分支,此命令可拉取数据,并自动合并对应分支。
默认情况下 git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支

使用git pull 时,请加上 –rebase,保持线性历史记录
before-pull
pull 前的状态

git-pull
git pull 等价于 git merge origin/master,执行后产生了分叉

git-pull-rebase
git pull –rebase,等价于 git rebase origin/master,前当前所有提交记录在 origin/master 上重演,保持线性历史。


$ git fetch [remote-name]

从远程仓库抓取数据到本地。不指定远程仓库名时默认为origin。此命令仅拉取数据,并不自动合并。


$ git push [remote-name] [branch-name]

将本地分支推送到远程仓库。
如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。


$ git push origin serverfix

推送本地serverfix分支到远程仓库origin的serverfix分支。


$ git push origin serverfix:awesomebranch

推送本地serverfix分支到远程仓库origin的awesomebranch。


$ git push origin :serverfix

删除远程仓库serverfix分支。


$ git branch

列出所有分支。* 所指的是 HEAD 所指向的分支,即当前工作分支。


$ git checkout -b serverfix origin/serverfix

根据远程仓库origin的serverfix分支新建本地serverfix分支。


$ git checkout --track origin/serverfix

效果同上。


$ git branch testing

在当前 commit 对象上新建一个分支指针。仅建立分支,但不切换。
HEAD指针总是指向当前正在工作的分支。


$ git checkout testing

切换到testing分支。


$ git checkout -b iss53

新建iss53分支,并切换到此分支,相当于:

$ git branch iss53
$ git checkout iss53

$ git branch -d hotfix

删除hotfix分支。-D为强制删除。


Git使用流程建议

  • Git 新建、切换分支速度很快,可以同时建多个分支进行不同功能的开发,调试。

  • 何时使用 rebase 何时使用 merge?

    • git pull 使用–rebase。本地分支操作用 merge。当master上有很多 commit 时,rebase 冲突的概率会很大,应当避免这种情况。这种情况更合理的做法是切换到一个新的分支,在新的分支开发。
    • 使用 sourcetree 进行本地分支的 merge 时,不要选择 Rebase instead of merge (最后一项)
  • 什么时候需要新建分支?

    • 需要多次提交时,或者改动较多时,新建分支开发。
    • 简单的 Bug 修复,或者只需要一两次提交小功能点,可以直接在本地的主干上开发。
  • 同步流程

    • 本地没有更新时,直接 git pull –rebase 即可与远程分支同步。
    • 在本地主干上开发,commit 到本地后,git pull –rebase 与远程分支同步,最后 push。
    • 在新分支上开发结束,要提交到远程分支时,先将 master 同步到最新,再将新分支 merge 到 master,最后 push。
    • 在新建的分支开发,需要与最新代码同步时,可以git merge origin/master。这种情况会造成较混乱提交历史记录,少用。